package com.tang.crm.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tang.crm.dto.CustomerLossDto;
import com.tang.crm.entity.CustomerLoss;
import com.tang.crm.entity.CustomerOrder;
import com.tang.crm.mapper.CustomerLossMapper;
import com.tang.crm.service.CustomerLossService;
import com.tang.crm.utils.AssertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class CustomerLossServiceImpl extends ServiceImpl<CustomerLossMapper, CustomerLoss> implements CustomerLossService {

    @Autowired
    private CustomerLossMapper customerLossMapper;

    /**
     * 分特查询流失客户
     * @param customerLossDto
     * @return
     */
    @Override
    public Map<String, Object> selectByParams(CustomerLossDto customerLossDto) {
        Map<String, Object> map = new HashMap<>();
        IPage<CustomerLoss> iPage = new Page<>(customerLossDto.getPage(), customerLossDto.getLimit());
        IPage<Map<String, Object>> mapIPage = customerLossMapper.selectAllByParams(iPage, customerLossDto);
        map.put("code", 0);
        map.put("msg", "");
        map.put("count", mapIPage.getTotal());
        map.put("data", mapIPage.getRecords());
        return map;
    }

    /**
     * 更新流失客户的流失状态
     *  1. 参数校验
     *      判断id非空且对应的数据存在
     *      流失原因非空
     *  2. 设置参数的默认值
     *      设置流失状态  state=1  0=暂缓流失，1=确认流失
     *      流失原因
     *      客户流失时间  系统当前时间
     *      更新时间     系统当前时间
     *  3. 执行更新操作，判断受影响的行数
     * @param id
     * @param lossReason
     */
    @Override
    @Transactional
    public void updateCustomerLossStateById(Integer id, String lossReason) {
        /* 1.参数校验 */
        // 判断id非空
        AssertUtil.isTrue(id == null, "待确认流失的客户不存在");
        // 判断流失客户记录是否存在
        CustomerLoss customerLoss = customerLossMapper.selectById(id);
        AssertUtil.isTrue(customerLoss == null, "待确认流失的客户不存在");

        /* 2.设置参数的默认值 */
        // 设置流失状态  state=1  0=暂缓流失，1=确认流失
        customerLoss.setState(1);
        // 设置流失原因
        customerLoss.setLossReason(lossReason);
        // 客户流失时间  系统当前时间
        customerLoss.setConfirmLossTime(new Date());
        // 更新时间     系统当前时间
        customerLoss.setUpdateDate(new Date());

        /* 3.执行更新操作，判断受影响的行数 */
        AssertUtil.isTrue(customerLossMapper.updateById(customerLoss), "确认流失失败");
    }
}
